package com.dy.分类.动态规划._120_三角形最小路径和;

import java.util.ArrayList;
import java.util.List;

/*
给定一个三角形，找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。

例如，给定三角形：

[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]
自顶向下的最小路径和为 11（即，2 + 3 + 5 + 1 = 11）。

说明：

如果你可以只使用 O(n) 的额外空间（n 为三角形的总行数）来解决这个问题，那么你的算法会很加分。


 */

/**
 * 思路：
 *      从底往上算，dp[][],dp[i][j]表示i行j列的最小值
 *          dp[i][j] = triangle[i][j]+min(dp[i+1][j],d[i+1][j+1])
 */
class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        int rows = triangle.size();
        int cols = triangle.get(rows-1).size();
        int[][] dp = new int[rows][cols];
        for(int i=0;i<cols;i++){
            dp[rows-1][i] = triangle.get(rows-1).get(i);
        }
        for(int i=rows-2;i>=0;i--){
            for(int j=0;j<triangle.get(i).size();j++){
                dp[i][j] = triangle.get(i).get(j)+Math.min(dp[i+1][j],dp[i+1][j+1]);

            }
        }
        return dp[0][0];
    }


    public static void main(String[] args) {
        Solution solution = new Solution();
        List<List<Integer>> triangle = new ArrayList<>();
        List<Integer> l = new ArrayList<>();
        l.add(2);
        triangle.add(l);
        l = new ArrayList<>();
        l.add(3);l.add(4);
        triangle.add(l);
        l = new ArrayList<>();
        l.add(6);l.add(5);l.add(7);
        triangle.add(l);
        l = new ArrayList<>();
        l.add(4);l.add(1);l.add(8);l.add(3);
        triangle.add(l);
        solution.minimumTotal(triangle);
    }
}
